# -*- coding: utf-8 -*- 
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/10/9
# @File : 22.D - FG operation.py
modulo = 998244353

def dp_solve():
    """
    二维线性dp：dp[i][j] 表示 数组前i个做这两个操作产生的最后的结果为j的方法数
    :return:
    """
    dp = [[0]*10 for _ in range(n+1)]#初始化
    dp[1][rate[1]] = 1#初始化，只有一个数的时候，那就只有是rate[1]=j时有一个方法。所以初始化为1。
    for i in range(2,n+1):
        for j in range(0,10):
            f = (j+rate[i])%10#两个操作
            g = (j*rate[i])%10

            dp[i][f] = (dp[i][f] + dp[i-1][j])%modulo
            dp[i][g] = (dp[i][g] + dp[i-1][j])%modulo
            #分别表示当前这一位可以如何由上一位转移过来：前i-1个数进行两个操作得到的十个j，每个对应产生这一位的两个f和g，他们是有可能相等和重复的，也有可能方法数为0，因此要累加。
    for i in range(0,10):
        print(dp[n][i])

"""
线性dp，不算难，但是不会做。
"""
if __name__ == '__main__':
    n = int(input())
    rate = [0]+[int(i) for i in input().split()]
    dp_solve()